package com.cskaoyan.javase.oop2._1extends._2conversion;

/**
 * 我们之前在Java基础时，学习过基本数据类型的数据类型转换，也提到过引用数据类型同样具有数据类型转换。
 * 那么何为引用数据类型的类型转换呢？有什么限制条件吗？
 *
 * 1.引用数据类型的类型转换,转换的是对象的类型还是引用的类型?
 *      是引用的类型,不是对象的类型!!!
 *
 * 2.引用数据类型要想发生类型转换,需要什么条件?
 *      引用数据类型的类型转换,必须发生在具有继承关系的两个类之间
 *      继承的优点: Java正是有了继承,打破了引用数据类型的类型限制
 *          让引用数据类型具有了类型转换
 *
 * 3.引用数据类型的类型转换,可以分为几种?
 *      两种
 *      1.自动类型转换
 *      2.强制类型转换
 *
 * 4.引用数据类型的自动类型转换
 *      指的是编译器自动完成引用的数据类型转换,无需写额外代码
 *   条件: 把子类引用转换成父类引用这个过程,是自动完成的,是自动类型转换
 *      这个过程依赖于子类"is-a"父类
 *      子类就可以当做父类来使用
 *   特殊的称呼: 父类在上,子类在下,引用数据类型的自动类型转换是把子类引用转换成父类引用
 *          从继承的方向上来说,是自下往上,称之为"向上转型"
 *          向上转型是自动完成的,不需要程序员写额外代码
 *
 * 5.引用数据类型的强制类型转换
 *      指的是编译器不会自动完成类型转换,需要程序员手动写代码完成类型转换(如果不写代码转换类型,会编译报错)
 *          语法: 强转后的类型类名 对象名=  (强转后的类型类名)引用名
 *      条件: 把父类引用转换成子类引用这个过程,编译器不会自动完成,需要程序员手动完成
 *          因为父类往往比子类功能更弱,往往不能当成子类来使用,所以 父 --> 子 是强转
 *
 *      特殊的称呼:
 *               从继承的方向上来说,是自上往下,称之为"向下转型"
 *
 *  注：强转相当于把父类对象当子类对象去使用，这在绝大多数情况下是不可能的。所以引用数据类型的强制类型转换想要完成，条件会更加很苛刻。（这里先了解一下概念，后续章节继会详细学习！）
 *
 * @since 11:10
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // 父类引用指向子类对象,这里发生了自动类型转换
        Father fs = new Son();
        // 上一行代码,可以这么写
        Son s = new Son();
        Father f;
        // 把子类引用s赋值给父类引用f,把子类引用转换成了父类引用,发生了自动类型转换
        f = s;

        Father fs2 = new Son2();


        // 强转很苛刻,不要乱做,会报错
        /*Father f2 = new Father();
        Son s2 = (Son) f2;
        Son2 s3 = (Son2) f2;*/
    }

}

class Father {
}

class Son extends Father {
}

class Son2 extends Father {
}
